package main

import (
	"encoding/json"
	"flag"
	"fmt"
	beego "github.com/beego/beego/v2/server/web"
	"github.com/beego/beego/v2/task"
	"ksd-social-api/commons/filter"
	_ "ksd-social-api/commons/filter"
	"ksd-social-api/commons/global"
	"ksd-social-api/commons/initilization"
	"ksd-social-api/commons/lock"
	"ksd-social-api/commons/taskjob"
	_ "ksd-social-api/modules"
	"net/http"
)

type IPGeoInfo struct {
	Status      string  `json:"status"`
	Country     string  `json:"country"`
	CountryCode string  `json:"countryCode"`
	Region      string  `json:"region"`
	RegionName  string  `json:"regionName"`
	City        string  `json:"city"`
	Zip         string  `json:"zip"`
	Lat         float64 `json:"lat"`
	Lon         float64 `json:"lon"`
	Timezone    string  `json:"timezone"`
	ISP         string  `json:"isp"`
	Org         string  `json:"org"`
	As          string  `json:"as"`
	Query       string  `json:"query"`
}

func GetIPGeoInfo(ip string) (*IPGeoInfo, error) {
	resp, err := http.Get(fmt.Sprintf("http://ip-api.com/json/%s", ip))
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()

	var info IPGeoInfo
	if err := json.NewDecoder(resp.Body).Decode(&info); err != nil {
		return nil, err
	}

	if info.Status != "success" {
		return nil, fmt.Errorf("failed to get IP info: %s", info.Status)
	}

	return &info, nil
}

//func main() {
//	// 设置随机种子
//	rand.Seed(time.Now().UnixNano())
//	// 开始范围随机
//	points := rand.Intn(5-1+1) + 1
//	fmt.Println(points)
//
//	info, err := GetIPGeoInfo("43.199.79.124") // 替换为你想查询的IP
//	if err != nil {
//		fmt.Println("Error:", err)
//		return
//	}
//
//	fmt.Printf("国家: %s\n省份/州: %s\n城市: %s\n",
//		info.Country, info.RegionName, info.City)
//}

func main() {
	//1：记录环境信息
	global.Env = beego.BConfig.RunMode
	//2：设定环境的日志级别，默认是prod环境下的error级别，意思就是：只有程序报错了才会进行日志写入到文件和控制台中。
	loggerLevel := "error"
	// 根据环境来设置日志级别
	if global.Env == "prod" {
		// 如果是开发环境，我们要方便调试我们代码。所以建议使用debug或者info都可以
		loggerLevel = "debug"
	}
	fmt.Println("当前启动的环境是：" + global.Env)
	//3：解析自定义的配置文件
	initilization.InitMyConfig()
	//4：初始化zap日志
	initilization.InitLogger(loggerLevel)
	//5：初始化redis
	initilization.InitRedis()
	lock.InitRedisLock()
	//6: 初始化数据库
	initilization.InitMYSQL()
	// oss文件存储
	initilization.InitOssClient()
	initilization.InitAlipayClient()
	//7: 打印路由信息
	//在开发环境可以使用打印把定义和初始化成功的路由全部打印出来，方便你查询和确认你定义的路由是否生效
	if global.Env == "dev" {
		tree := beego.PrintTree()
		methods := tree["Data"].(beego.M)
		for k, v := range methods {
			fmt.Printf("%s => %v\n", k, v)
		}
	}

	//8: 启动定时任务
	taskjob.InitTask()
	task.StartTask()

	// 静态目录设置
	beego.SetStaticPath("/static", "resources")
	// 跨域问题
	beego.InsertFilter("/api/*", beego.BeforeRouter, filter.CorsFilter)
	// 白名单验证
	beego.InsertFilter("/api/*", beego.BeforeRouter, filter.AppidFilter)
	// 登录和不登录的安全校验token
	beego.InsertFilter("/api/*", beego.BeforeRouter, filter.TokenFilter)
	// 全局拦截器--登录拦截
	beego.InsertFilter("/api/v1/*", beego.BeforeRouter, filter.LoginFilter)

	port := flag.String("port", "8089", "服务端口")
	flag.Parse()
	//9: beego框架的运行和启动
	beego.Run(fmt.Sprintf(":%s", *port))
}
